#
# ﻿Empresa desarrolladora: Fujitsu Technology Solutions S.A. - http://ts.fujitsu.com Felipe Munoz Castillo - 29/07/2013
#
# Autor: Junta de Andalucía
# Derechos de explotación propiedad de la Junta de Andalucía.
#
# Éste programa es software libre: usted tiene derecho a redistribuirlo y/o modificarlo bajo los términos de la Licencia EUPL European Public License publicada por el organismo IDABC de la Comisión Europea, en su versión 1.0. o posteriores.
#
# Éste programa se distribuye de buena fe, pero SIN NINGUNA GARANTÍA, incluso sin las presuntas garantías implícitas de USABILIDAD o ADECUACIÓN A PROPÓSITO CONCRETO. Para mas información consulte la Licencia EUPL European Public License.
#
# Usted recibe una copia de la Licencia EUPL European Public License junto con este programa, si por algún motivo no le es posible visualizarla, puede consultarla en la siguiente URL: http://ec.europa.eu/idabc/servlets/Docb4f4.pdf?id=31980
#
# You should have received a copy of the EUPL European Public License along with this program. If not, see
# http://ec.europa.eu/idabc/servlets/Docbb6d.pdf?id=31979
#
# Vous devez avoir reçu une copie de la EUPL European Public License avec ce programme. Si non, voir http://ec.europa.eu/idabc/servlets/Doc5a41.pdf?id=31983
#
# Sie erhalten eine Kopie der europäischen EUPL Public License zusammen mit diesem Programm. Wenn nicht, finden Sie da http://ec.europa.eu/idabc/servlets/Doc9dbe.pdf?id=31977
#
#
require 'rgl/adjacency'

class CustomFieldDependentProjectSettingsController < ApplicationController
 
  unloadable
  layout 'base'

  before_filter  :find_project, :find_user

  def create 
    
    if (@cfd.nil?)
      @cfd = CustomFieldDependent.new(params[:cfd])
      @cfd.project = @project
    end

    begin
      # Antes de guardar miramos que no exista
      if repeated
        # si repetido, informamos de tal cosa
        flash[:error] = l(:custom_field_dependent_save_exist)

      # Si no existe, miramos que no haya ciclo
      elsif exist_cycle
        # si existe ciclo, informamos de tal cosa
        flash[:error] = l(:custom_field_dependent_save_cycle)
      else 
        # Si guardamos correctamente ponemos el mensaje de exito
        @cfd.save
        flash[:notice] = l(:custom_field_dependent_save_success)

        # En caso de que se guarde sin error, quitamos el valor
        # del tercer select para que se siga introduciendo parametros
        @cfd.conditioned_custom_field = nil

      end    
    rescue
      # en caso contrario informamamos del error
      flash[:error] = l(:custom_field_dependent_save_error)
    end

    redirect_to :controller => 'projects',
                :action => "settings",
                :id => @project,
                :tab => 'custom_field_dependent_project_settings',
                :p_cfd_conditioning_custom_field => @cfd.conditioning_custom_field,
                :p_cfd_conditioning_value => @cfd.conditioning_value,
                :p_cfd_conditioned_custom_field => @cfd.conditioned_custom_field


  end

  def delete
    @cfd = CustomFieldDependent.find(params[:id_cfd])
    @cfd.destroy
    flash[:notice] = l(:custom_field_dependent_delete_success)
    redirect_to :controller => 'projects', :action => "settings", :id => @project, :tab => 'custom_field_dependent_project_settings'
  end

  private

  private
  def find_project
    @project = Project.find(params[:idproject])

  end
  
  def find_user
    @user = User.current
  end

  # Comprueba si existe algún ciclo en las dependencias
  def exist_cycle
    
    # si se está relacionando el mismo elemento, existe ciclo
    exit_cycle = (@cfd.conditioning_custom_field.id == @cfd.conditioned_custom_field.id)

    unless exit_cycle 

      # miramos si hay un ciclo directo
      exit_cycle = CustomFieldDependent.where(
        :project_id => @project.id,
        :conditioning_custom_field_id => @cfd.conditioned_custom_field.id,
        :conditioned_custom_field_id => @cfd.conditioning_custom_field.id
        ).exists?
      unless exit_cycle
        
        # Cogemos todas las dependencias
        cfds = CustomFieldDependent.where( :project_id => @project.id)

        unless cfds.empty?
          gr=RGL::DirectedAdjacencyGraph.new
          gr.add_edge(@cfd.conditioning_custom_field.id,@cfd.conditioned_custom_field.id)
          cfds.each do |curent_cfd|
            gr.add_edge(
              curent_cfd.conditioning_custom_field.id,
              curent_cfd.conditioned_custom_field.id)
          end
          exit_cycle = ! gr.cycles.empty?
        end

      end
    end

    return exit_cycle
  end

  def repeated
    CustomFieldDependent.where(
      :project_id => @project.id,
      :conditioning_custom_field_id => @cfd.conditioning_custom_field.id,
      :conditioned_custom_field_id => @cfd.conditioned_custom_field.id,
      :conditioning_value => @cfd.conditioning_value,
      ).exists?
  end

end
